# 认证数据传输对象 (DTOs) v2
from flask_restx import Namespace, fields

# 从主包导入命名空间
from .. import auth_ns

# 登录请求 DTO v2 (添加了记住我选项)
login_model = auth_ns.model('Login', {
    'username': fields.String(required=True, description='用户名或邮箱'),
    'password': fields.String(required=True, description='密码'),
    # v2 新增字段
    'remember_me': fields.Boolean(description='记住登录状态', default=False)
})

# 注册请求 DTO v2 (添加了服务条款同意)
register_model = auth_ns.model('Register', {
    'username': fields.String(required=True, description='用户名'),
    'email': fields.String(required=True, description='电子邮件'),
    'password': fields.String(required=True, description='密码'),
    'confirm_password': fields.String(required=True, description='确认密码'),
    'nickname': fields.String(description='昵称'),
    # v2 新增字段
    'agree_terms': fields.Boolean(required=True, description='同意服务条款'),
    'marketing_consent': fields.Boolean(description='同意接收营销信息', default=False)
})

# 令牌响应 DTO v2 (添加了更多信息)
token_model = auth_ns.model('Token', {
    'access_token': fields.String(description='访问令牌'),
    'refresh_token': fields.String(description='刷新令牌'),
    'token_type': fields.String(description='令牌类型'),
    'expires_in': fields.Integer(description='令牌过期时间(秒)'),
    # v2 新增字段
    'user_info': fields.Raw(description='用户基本信息'),
    'permissions': fields.List(fields.String(), description='用户权限列表')
})

# 刷新令牌请求 DTO
refresh_model = auth_ns.model('RefreshToken', {
    'refresh_token': fields.String(required=True, description='刷新令牌')
})

# 密码重置请求 DTO
password_reset_request_model = auth_ns.model('PasswordResetRequest', {
    'email': fields.String(required=True, description='电子邮件')
})

# 密码重置确认 DTO
password_reset_confirm_model = auth_ns.model('PasswordResetConfirm', {
    'token': fields.String(required=True, description='重置令牌'),
    'new_password': fields.String(required=True, description='新密码'),
    'confirm_password': fields.String(required=True, description='确认新密码')
})

# 密码修改 DTO
password_change_model = auth_ns.model('PasswordChange', {
    'old_password': fields.String(required=True, description='旧密码'),
    'new_password': fields.String(required=True, description='新密码'),
    'confirm_password': fields.String(required=True, description='确认新密码')
})

# v2 新增：双因素认证模型
two_factor_setup_model = auth_ns.model('TwoFactorSetup', {
    'secret': fields.String(description='二步验证密钥'),
    'qr_code': fields.String(description='二维码URL'),
    'backup_codes': fields.List(fields.String(), description='备用恢复码')
})

two_factor_verify_model = auth_ns.model('TwoFactorVerify', {
    'code': fields.String(required=True, description='二步验证码')
})